-
-
Notifications
You must be signed in to change notification settings - Fork 733
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Rework import order for SQLCipher; add test conditionals for Android #1708
base: development
Are you sure you want to change the base?
Conversation
Addendum: out of curiosity, I ran some comparisons between the built-in SQLite and the SQLCipher build with the following script (and adding a The results over a dozen runs are a fairly consistent slowdown of around 10% when using SQLCipher. It'd be interesting to tweak the SQLite build flags in swift-sqlcipher to see what might increase/decrease the performance.
|
@marcprux the Android NDK doesn't seem to bundle sqlite3.h, whereas GRDB and your PR do rely on that being available. How are you providing that right now when building and testing GRDB? |
It is included with the SQLCipher source module: https://github.com/skiptools/swift-sqlcipher/tree/main/Sources/SQLCipher/sqlite |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hello @marcprux,
I like that very much. This pull request is a great gift 🎁! I'll shortly play with the new targets.
I made a first review and preliminary comments. I hope we agree on the broad outlines!
Isn't it just the cipher? (EDIT: I'm wrong because performance tests don't run on encrypted databases, see comment below.) SQLCipher can also be extremely slow when it opens a connection. Some people have reported up to 0.5 seconds (😱). To the point I had to ship #1350. |
I ran the same performance tests, but this time in release configuration:
This time, SQLCipher tests are faster. |
Agreed, but the performance hit should only occur when encryption is actually enabled on the database, which shouldn't affect any of the perf tests.
Of course! Foolish of me to not do that. Otherwise, it is comparing the debug build of the sqlcipher/sqlite source build against the release build of the vendored sqlite. It is heartening to see that superior performance can be squeezed out of a source build. I wonder how much more might be managed with strategic performance-related flags (e.g., sbooth/CSQLite#59 (comment)). |
…abilites on non-Dawin platforms missing XCTIssue
… rather than disabiling them altogether
Apologies for the long delay in addressing the feedback (I was traveling). I believe I've handled each of the requested changes. Let me know if I can do anything else to help get this PR over the finish line – it has grown quite large, so I'm nervous that rebasing is going to be difficult if it starts to become stale. |
We've been using this branch successfully. |
I'll follow up on the list of needs at https://mastodon.social/@[email protected]/113990450491505387 here, just to keep it in the PR record.
This should work out of the box for anyone that just changes: dependencies: [
.package(url: "https://github.com/groue/GRDB.swift.git", from: "7.0.0"),
] to the (theoretical) locally-maintained fork: dependencies: [
.package(url: "https://github.com/groue/GRDB-SQLCipher.swift.git", from: "7.0.0"),
]
You are welcome to relocate https://github.com/skiptools/swift-sqlcipher.git into the
This isn't part of this PR, but it would only be a couple of lines in the README.
This is part of the PR. The new
The tests do run against SQLCipher, but against an unencrypted database. I didn't see how this is being done with SQLCipher for CocoaPods, but I suppose we could just do the same setup here (perhaps just based on checking the
This shouldn't be an issue. Just activate (i.e., un-comment) the
For the SQLCipher dependency, you just need to make a new amalgamated sqlite.c from sqlcipher, commit it, and then tag a release. This is done with the script: https://github.com/skiptools/swift-sqlcipher/blob/main/scripts/build_sqlcipher.sh An example of this sort of update commit is the bump to sqlite 3.46.1 and sqlcipher 4.6.1: skiptools/swift-sqlcipher@5ea2f8b For GRDB itself, my proposal is that you maintain a fork of It is a little bit of overhead, but it could be added as another step in any scripts you might already be using to maintain releases.
This is certainly a shortcoming of this method. I unfortunately don't see any solution other than to also have a This last point is indeed painful. However, I think this PR gets us a lot, with minimal intrusion on the existing GRDB structure. A more "correct" solution would be along the lines of #1701, which requires a large refactoring and had performance implications, and so was rejected. We can have a working GRDB-SQLCipher implementation (plus Android support!) today with this PR, while still continuing to design a more ideal future implementation. |
This is a less ambitious alternative to #1701 that enables adding a SQLCipher source dependency to the Package.swift based on the
GRDBCIPHER
environment variable. Tests can be run with the dependency with a command like:Running it without the environment variable will leave things exactly as they are. The majority of changes in this PR are simply re-ordering the import header checks for
GRDBCIPHER
andSWIFT_PACKAGE
, since we would need the former to take precedence of the latter.An advantage of doing it this way is that it facilitates creating a
GRDB-SQLCipher
fork that can follow the releases of the upstream. The only change in such a fork would be to hardwire theGRDBCIPHER
setting in Package.swift to some SQLCipher source repository (either mine, or one that you maintain). When a client package wants to switch between GRDB and GRDB-SQLCipher, they would just need to swap their dependency URL.This PR also adds in support building and testing against Android, mostly by stubbing out the unit tests that can't compile due to missing
NSFileCoordinator
,Combine
, and the like. Android tests can be run with skip:Most of the tests pass, but there are a few that need to be investigated. I'll look into them next.
Closes #1701